// 闭包可以捕获其作用域中的变量。捕获的方式有三种：
//
// 不可变借用 (&T)
// 可变借用 (&mut T)
// 所有权 (T)

// 闭包通过不可变借用捕获变量：
#[test]
fn test_ref_env(){
    let x = 5;
    let print_x = || println!("x = {}", x);
    print_x(); // 输出: x = 5
    println!("{}", x);
}
// 闭包通过可变借用捕获变量：
#[test]
fn test_mut_ref_env(){
    let mut x = 5;
    let mut add_to_x = |y| x += y;
    add_to_x(3);
    println!("x = {}", x); // 输出: x = 8
    println!("{}", x);
}
// 闭包通过所有权捕获变量：
#[test]
fn test_owner(){
    let x = vec![1, 2, 3];
    let consume_x = move || {
        println!("Consuming x: {:?}", x);
        // x 在这里被移动了
    };
    consume_x();
    // println!("{:?}", x); // 这里会报错，因为 x 已经被移动了
}